import { Provide, Middleware, Config } from '@midwayjs/decorator';
import { Context } from '@midwayjs/web'; // 使用 Web 模块的 Context
import jwt from 'jsonwebtoken';

/**
 * JWT 认证中间件
 * 对需要鉴权的接口进行 token 验证
 */
@Provide()
@Middleware()
export class AuthMiddleware {
  @Config('jwt')
  jwtConfig: any;

  /**
   * resolve 方法返回真正的中间件函数
   * ctx: 请求上下文
   * next: 调用下一个中间件
   */
  resolve() {
    return async (ctx: Context, next: () => Promise<any>) => {
      // 从请求头或 query 获取 token
      const token = ctx.get('authorization')?.replace('Bearer ', '') || ctx.query.token;

      // 没有 token 返回 401
      if (!token) {
        ctx.status = 401;
        ctx.body = {
          success: false,
          error: '缺少令牌',
        };
        return;
      }

      try {
        // 验证 JWT，使用配置的密钥
        const decoded = jwt.verify(token, this.jwtConfig?.secret || process.env.JWT_SECRET || 'heart_neighbor_secret_key');

        // 将用户信息挂载到 ctx.state
        ctx.state.user = decoded;

        // 检查用户是否被禁用（如果用户对象中有相关字段）
        if (ctx.state.user?.isDisabled || ctx.state.user?.is_enabled === 0) {
          ctx.status = 403;
          ctx.body = {
            success: false,
            error: '账户已被禁用',
          };
          return;
        }

        // 调用下一个中间件
        await next();
      } catch (err: any) {
        // 根据错误类型返回不同的状态码
        if (err.name === 'TokenExpiredError') {
          ctx.status = 401;
          ctx.body = {
            success: false,
            error: '令牌已过期',
          };
        } else if (err.name === 'JsonWebTokenError') {
          ctx.status = 401;
          ctx.body = {
            success: false,
            error: '令牌无效',
          };
        } else {
          // 其他认证相关错误返回403
          ctx.status = 403;
          ctx.body = {
            success: false,
            error: '权限不足',
          };
        }
      }
    };
  }
}
